﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaSeleccionarDuplicados
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PSeleccionarDuplicados : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Entrada, value);
            }
        }

        /// <summary>
        /// Estructura de entrada y de salida.
        /// </summary>
        public string Estructura
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.Estructura);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Estructura, value);
            }
        }

        /// <summary>
        /// Lista de campos que conforman la clave de los datos.
        /// </summary>
        public List<string> ListaCamposClave
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.CamposClave);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CamposClave, value);
            }
        }

        /// <summary>
        /// Lista de salidas de datos.
        /// </summary>
        public List<string> ListaSalidas
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.Salidas);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.Salidas, value);
            }
        }

        /// <summary>
        /// Lista de criterios de selección de duplicados.
        /// </summary>
        public List<string> ListaCriteriosDuplicados
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.CriteriosDuplicados);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CriteriosDuplicados, value);
            }
        }

        /// <summary>
        /// Lista de parametros de los criterios de selección.
        /// </summary>
        public List<string> ListaParametrosCriterios
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDuplicados.ParametrosCriterios);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.ParametrosCriterios, value);
            }
        }

        /// <summary>
        /// Campo en el que incluir un número secuencial de cada ventana de datos encontrada.
        /// </summary>
        public string CampoVentana
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.CampoVentana);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CampoVentana, value);
            }
        }

        /// <summary>
        /// Campo en el que incluir un número secuencial dentro de cada ventana de datos encontrada.
        /// </summary>
        public string CampoSecuencia
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDuplicados.CampoSecuencia);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDuplicados.CampoSecuencia, value);
            }
        }
        

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PSeleccionarDuplicados()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);
            
            this.Entrada = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaEntrada);
            this.Estructura = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaEstructura);

            // Claves
            int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDuplicados.RutaClaves);
            for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
            {
                string campo = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaClaves, indiceCampo);
                if (!string.Empty.Equals(campo))
                    this.ListaCamposClave.Add(campo);
            }
                
            // Salidas
            int numeroSalidas = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDuplicados.RutaSalidas);
            for (int indiceSalida = 0; indiceSalida < numeroSalidas; indiceSalida++)
            {
                string salida = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, "./" + CSeleccionarDuplicados.NodoSalidaDatos);
                if (!string.Empty.Equals(salida))
                {
                    this.ListaSalidas.Add(salida);

                    // Criterios selección duplicados
                    string criterio = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, "./" + CSeleccionarDuplicados.NodoSalidaDuplicados);
                    if (!new CListasFunciones().ListaFuncionesSeleccionDuplicados.Contains(criterio))
                        criterio = string.Empty;
                    this.ListaCriteriosDuplicados.Add(criterio);
                    // Parametros de criterios
                    string parametro = string.Empty;
                    try
                    { parametro = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSalidas, indiceSalida, "./" + CSeleccionarDuplicados.NodoSalidaParametro); }
                    catch (Exception)
                    { parametro = string.Empty; }
                    this.ListaParametrosCriterios.Add(parametro);
                }
            }

            // Campo secuencia de ventana
            try
            { this.CampoVentana = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaVentana); }
            catch (Exception)
            { this.CampoVentana = string.Empty; }

            // Campo secuencia dentro de cada ventana
            try
            { this.CampoSecuencia = LeerXml.ObtenerValorCampo(xml, CSeleccionarDuplicados.RutaSecuencia); }
            catch (Exception)
            { this.CampoSecuencia = string.Empty; }
        }
    }
}
